#include<iostream>
#include<string>
#include<cstring>
#include<cerrno>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>

void Usage(std::string proc)
{
  std::cout<<"Usage: \n\t"<<proc<<" server_ip server_port"<<std::endl;
}
//./udp_client \server_ip \server_port


int main(int argc,char* argv[])
{//1.创建套接字
if(argc!=3)
{
  Usage(argv[0]);
  return 0;
}
  int sock=socket(AF_INET,SOCK_DGRAM,0);
  if(sock<0)
  {
    std::cerr<<"socket error:"<<errno<<std::endl;
    return 1;
  }

//2.首先客户端也需要ip和port,
//客户端不需要显示bind，一旦显示bind，就必须明确，client要和哪一个port关联
//client指明的端口号，在client端一定会有吗？有可能被占用,被占用导致client无法使用
//server要的是Port必须明确而且不变,client只要有就行!一般是由操作系统自动给你bind()
//就是client正常发送数据时，OS会自动给你BInd，采用的是随机端口的方式
//2.使用服务
 //你要发给谁
  struct sockaddr_in server;
  server.sin_family=AF_INET;
  server.sin_port=htons(atoi(argv[2]));
  server.sin_addr.s_addr=inet_addr(argv[1]);
 while(1)
 {
  //你的数据从哪来
  //std::string message;
  //std::cout<<"输入#";
  //std::cin>>message;
  std::cout<<"Myshell $ ";
  char line[1024];
  fgets(line,sizeof(line),stdin);
  sendto(sock,line,strlen(line),0,(struct sockaddr*)&server,sizeof(server));
  struct sockaddr_in tmp;
  socklen_t len=sizeof(tmp);
  char buffer[1024];
  ssize_t cnt=recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&tmp,&len);
  if(cnt>0)
  {
    buffer[cnt]=0;
    std::cout<<buffer<<std::endl;
  }
  else{
    //TODO
  }
 }
  return 0;
}
